package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.*;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ContractService;
import cn.itcast.service.cargo.ExportProductService;
import cn.itcast.service.cargo.ExportService;
import cn.itcast.vo.ExportProductVo;
import cn.itcast.vo.ExportResult;
import cn.itcast.vo.ExportVo;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.cxf.jaxrs.client.WebClient;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/cargo/export")
@Slf4j
public class ExportController extends BaseController{

    // 注入dubbo的服务接口的代理对象
    @Reference
    private ContractService contractService;
    @Reference
    private ExportService exportService;
    @Reference
    private ExportProductService exportProductService;

    /**
     * 合同管理，只显示状态为1的购销合同（已提交）
     */
    @RequestMapping("/contractList")
    public String contractList(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "5") Integer pageSize) {
        log.info("执行用户分页的方法");

        // 构造查询对象
        ContractExample example = new ContractExample();
        example.setOrderByClause("create_time desc");
        ContractExample.Criteria criteria = example.createCriteria();
        // 添加查询条件：compnay_id
        criteria.andCompanyIdEqualTo(getLoginCompanyId());
        // 添加查询条件：state
        criteria.andStateEqualTo(1);

        PageInfo<Contract> pageInfo =
                contractService.findByPage(example, pageNum, pageSize);;

        // 存储查询结果
        request.setAttribute("pageInfo", pageInfo);

        // 进入合同管理列表
        return "cargo/export/export-contractList";
    }


    /**
     * 报运单列表
     */
    @RequestMapping("/list")
    public String list(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "5") Integer pageSize) {
        log.info("执行报运单列表分页的方法");

        // 构造查询对象
        ExportExample example = new ExportExample();
        example.setOrderByClause("create_time desc");
        ExportExample.Criteria criteria = example.createCriteria();
        // 添加查询条件：compnay_id
        criteria.andCompanyIdEqualTo(getLoginCompanyId());

        PageInfo<Export> pageInfo =
                exportService.findByPage(example, pageNum, pageSize);;

        // 存储查询结果
        request.setAttribute("pageInfo", pageInfo);

        // 进入合同管理列表
        return "cargo/export/export-list";
    }

    /**
     * 进入报运单添加页面
     * 请求地址：http://localhost:8080/cargo/export/toExport.do
     * 请求参数：
     *      id 购销合同id
     *      id 购销合同id
     * 注意：
     *      在web开发中，如果请求参数名称一样的多个值，在后台可以用数组接收，
     *      或者字符串接收，字符串接收的话自动逗号隔开
     */
    @RequestMapping("/toExport")
    public String toExport(String id){
        // 存储购销合同的id
        request.setAttribute("id",id);
        return "cargo/export/export-toExport";
    }

    /**
     * 添加、修改
     */
    @RequestMapping("/edit")
    public String edit(Export export) {
        export.setCompanyId(getLoginCompanyId());
        export.setCompanyName(getLoginCompanyName());
        // 判断
        if (StringUtils.isEmpty(export.getId())) {
            log.info("添加....");
            // 设置创建时间
            export.setCreateTime(new Date());
            exportService.save(export);
        } else {
            log.info("修改....");
            exportService.update(export);
        }
        // 添加成功，重定向到报运单列表
        return "redirect:/cargo/export/list";
    }


    /**
     * 进入修改页面
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id) {

        //1. 根据报运单的id查询报运单
        Export export = exportService.findById(id);

        //2. 根据报运单的id，查询报运单的所有商品
        ExportProductExample example = new ExportProductExample();
        // 查询条件：export_id
        example.createCriteria().andExportIdEqualTo(id);
        List<ExportProduct> exportProductList = exportProductService.findAll(example);

        //3. 保存
        request.setAttribute("export",export);
        request.setAttribute("eps",exportProductList);
        return "cargo/export/export-update";
    }

    /**
     * 提交、取消
     * http://localhost:8080/cargo/export/submit.do?id=7
     * http://localhost:8080/cargo/export/cancel.do?id=7
     */
    @RequestMapping("/submit")
    public String submit(String id){
        // 创建报运单对象，修改状态为1，已提交
        Export export = new Export();
        export.setId(id);
        export.setState(1);
        // 修改，动态sql，对象属性有值才修改
        exportService.update(export);
        return "redirect:/cargo/export/list";
    }
    @RequestMapping("/cancel")
    public String cancel(String id){
        // 创建报运单对象，修改状态为0，已提交
        Export export = new Export();
        export.setId(id);
        export.setState(0);
        // 修改，
        exportService.update(export);
        return "redirect:/cargo/export/list";
    }

    /**
     * 电子报运：远程访问海关报运平台的webservice服务
     */
    @RequestMapping("/exportE")
    public String exportE(String id){
        // 封装报运的结果:ExportVo
        ExportVo exportVo = new ExportVo();
        // 根据报运单id查询
        Export export = exportService.findById(id);
        // 对象拷贝: org.springframework.beans.BeanUtils
        BeanUtils.copyProperties(export,exportVo);
        // 【......设置报运单id.......】
        exportVo.setExportId(id);

        // 封装webservice请求的报运单的商品集合
        List<ExportProductVo> products = exportVo.getProducts();
        // 根据报运单id，查询报运商品
        ExportProductExample example = new ExportProductExample();
        example.createCriteria().andExportIdEqualTo(id);
        List<ExportProduct> exportProductList = exportProductService.findAll(example);
        if (exportProductList != null && exportProductList.size()>0){
            for (ExportProduct exportProduct : exportProductList) {
                // 创建webservice请求的商品对象
                ExportProductVo vo = new ExportProductVo();
                // 对象拷贝
                BeanUtils.copyProperties(exportProduct,vo);
                // 【......设置报运单id.......】
                vo.setExportId(id);
                // 【......设置商品id.......】
                vo.setExportProductId(exportProduct.getId());
                // 添加到集合
                products.add(vo);
            }
        }
        //exportVo.setProducts(products);


        //远程访问webservice服务（1）录入报运单信息
        WebClient.create("http://192.168.77.45:9001/ws/export/user").post(exportVo);
        //远程访问webservice服务（2）查询报运结果
        ExportResult exportResult = WebClient
                .create("http://192.168.77.45:9001/ws/export/user/" + id)
                .get(ExportResult.class);


        //根据远程调用结果，修改数据库（报运单状态、备注、商品交税金额）
        exportService.updateByExportResult(exportResult);
        return "redirect:/cargo/export/list";
    }

    @RequestMapping("/state")
    @ResponseBody
    public Map<String,Integer> state(String id) {
        Map<String,Integer> result = new HashMap<>();

        Export export = exportService.findById(id);
        if (export.getState() == 2){
            // 该报运单已报运
            result.put("message",1);
        }else {
            // 该报运单未报运
            result.put("message",0);
        }
        return result;
    }

}











